package com.games.chaoshi;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

import static com.games.chaoshi.ConstantSup.*;
import static com.games.chaoshi.Store.listStore;

//收银管理类
public class CashManager {

    Scanner input = new Scanner(System.in);
    boolean r = true;
    public void startCash() {
        do {
            System.out.println("请输入进入收银管理权限的密码：");
            String mima2 = input.next();
            if (mima2.equals(shouyindenglumima)) {
                listStore();

                System.out.println("----->结账管理");
                System.out.println("1.扫描购买商品 2.修改购买数量 3.结账 4.返回上一级");
                int i = input.nextInt();

                switch (i) {
                    case 1:
                        saomiao();
                        startCash();
                        break;
                    case 2:
                        xiugai();
                        startCash();
                        break;
                    case 3:
                        jiezhang();
                        startCash();
                        break;
                    case 4:
                        //startStore();
                        break;
                    default:
                        startCash();
                }
                r = false;

            } else {
                System.out.println("收银管理密码不正确，请输入正确的收银管理密码：");
            }

        } while (r);


    }

    private void saomiao() {
        System.out.println("----->扫描购买商品");
        System.out.println("请输入需要扫描购买商品的编号");
        int goodsIdInput = input.nextInt();

        //通过编号在 仓库中 查找
        Goods g1 = Store.getGoodsBygoodsId(goodsIdInput); //g3是商品，不是商品名称
        //如果仓库中有 该商品：
        if (g1 != null) {
            System.out.println("请输入购买的数量");
            int count = input.nextInt();
            if (count >= 0) {
                //在 购物车中 查找该编号的商品：(注意:此处不能直接用for迭代器,程序会不运行的！！！)
                CartGoods g2 = CartGoodsDao.findMyCartGoodsBygoodsId(goodsIdInput); //g2是局部变量！
                //如果(仓库中有i) 购物车也中 有i：
                if (g2 != null) {	/*用“=”的话，相当于把int转化为boolean,"=="是一个
											boolean的概念！而if括号里面必须放boolean型,故匹配错误！*/
                    if (g2.getQuality() + count <= g1.getCount()) {
                        g2.setQuality(g2.getQuality() + count);
                        // 显示购物车中的所有商品信息:
//                        CartGoodsDao.showAllgoodsforGowuche();

                        //如果仓库中该商品的数量<购物车中该商品的数量：
                        if (g1.getCount() < g2.getQuality()) {
                            System.out.println("库存不足，请修改购买(减少)数量");
                        }
                    } else {
                        System.out.println("仓库不足，请修改数量");
                    }
                    //如果(仓库中有i) 购物车中却 没有i,则在购物车中添加该商品：
                } else {
                    // 仓库存在此商品，并且购物车中没有此商品。在购物车中 添加   此商品(仓库中存在的该商品g3!!!)
                    CartGoods g21 = new CartGoods(goodsIdInput, count);
                    CartGoodsDao.dingdan.add(g21);
                    // 显示购物车中的所有商品信息:
                    CartGoodsDao.showAllgoodsforGowuche();
                }
            } else {
                System.out.println("请输入正确的数量");
            }
        } else {
            System.out.println("扫描失败，库存中没有此商品");
        }

        // 显示购物车中的所有商品信息:
        CartGoodsDao.showAllgoodsforGowuche();
    }



	/*private void showAllgoodsforGowuche() {

		if(!gouwuche.dingdan.isEmpty()){
			System.out.println("商品编号\t商品名称\t\t商品数量\t商品价格\t合计金额");
			System.out.println("============================================================");
			for(gouwucheGoods temp:gouwuche.dingdan){

				System.out.println(temp.getId2()+"\t"+
								   Store.getGoodsBygoodsId(temp.getId2()).getName() +"\t"+"\t"+
								   temp.getCount2()+"\t"+
								   Store.getGoodsBygoodsId(temp.getId2()).getPrice()+"\t"+
								   (Store.getGoodsBygoodsId(temp.getId2()).getPrice()*temp.getCount2()));

			}
			System.out.println("============================================================");



		} //else{"您的购物车为空，没有添加任何商品！"}

	}*/


    private void xiugai() {

        System.out.println("----->修改购买数量");

        if (!CartGoodsDao.dingdan.isEmpty()) {// 另一种写法：if(!(gouwuche.dingdan.size()==0)){
            // 显示购物车中的所有商品信息:
            CartGoodsDao.showAllgoodsforGowuche();


            System.out.println("请输入需要修改的商品编号");
            if (input.hasNextInt()) {
                int i1 = input.nextInt();

                //在 购物车中 查找该编号的商品：(注意:此处不能直接用for迭代器,程序会不运行的！！！)
                CartGoods g2 = CartGoodsDao.findMyCartGoodsBygoodsId(i1); //g2是局部变量！

                //如果 购物车 中有该编号的商品，则在购买数量上增加：
                if (g2 != null) {
                    System.out.println("请输入修改的数量：");
                    if (input.hasNextInt()) {
                        int count2 = input.nextInt();

                        //在 仓库中 查找该编号的商品(以 获得该商品在仓库中的库存！！！)：
                        Goods g = Store.getGoodsBygoodsId(i1);
                        if (count2 > 0) {
                            if (count2 <= g.getCount()) {

                                g2.setQuality(count2);//改变(重置)该商品在购物车中的数量

                                System.out.println("修改数量成功");

//                                System.out.println("商品编号\t商品名称\t\t商品数量\t商品价格\t合计金额");
//                                System.out.println("============================================================");
//                                System.out.println(g2.getCartId() + "\t" +
//                                        g2.getQuality() + "\t"
//                                );
//                                System.out.println("============================================================");
                                // 显示购物车中的所有商品信息:
                                CartGoodsDao.showAllgoodsforGowuche();
                            } else {
                                System.out.println("仓库不足，请修改(减少)该商品的购买数量");
                            }
                        } else {
                            System.out.println("商品数量为正数，输入有误！");
                        }
                    }//else{System.out.println("输入有误，商品数量为数字，请输入数字！");}

                } else {
                    System.out.println("没有扫描此商品，请重新输入");
                }


            }//else{System.out.println("输入有误，商品编号为数字，请输入数字！");}


        } else {
            System.out.println("购物车为空，不能修改商品数量！");
        }
    }


    private void jiezhang() {
        System.out.println("----->结账");
        if (!CartGoodsDao.dingdan.isEmpty()) {
            // 显示购物车中的所有商品信息:
            CartGoodsDao.showAllgoodsforGowuche();

            System.out.println("此次购物您需要合计支付" + NeedMoney() + "元");

            //public void startStore(){}此处为什么不能放？？？？？？？？？？？？？
            System.out.println("请选择结账方式：1.普通结账，2.会员结账");
            int i = input.nextInt();
            switch (i) {
                case 1:
                    putong();
                    break;
                case 2:
                    huiyuan();
                    break;
            }


        } else {
            System.out.println("购物车为空，请返回扫描商品：");
            saomiao();
        }

    }

    //得到购物车中商品总金额 的方法：
    private double NeedMoney() {
        double needMoney = 0;

        for (CartGoods temp : CartGoodsDao.dingdan) {
            needMoney += Store.getGoodsBygoodsId(temp.getCartId()).getPrice() * temp.getQuality();
        }
        //语法： 将购物所需的钱格式化，保留两位小数到分。
        BigDecimal bg = new BigDecimal(needMoney);
        needMoney = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return needMoney;
        /*
         * *BigDecimal(double val)：将 double 转换为BigDecimal,BigDecimal是二进制浮点值(double)准确的十进制表
         *示形式.返回值 是标度<精确度>向小数点后 移动<scale>位 是使 (10的<scale>次方 × val) 为整数的最小值。
         *
         * BigDecimal.ROUND_HALF_UP指BigDecimal调用"四舍五入的方法":向“最接近的”数字舍入
         *
         * scale:标度，数字范围！   (通俗说就是 把 这个BigDecimal类型的值 的newScale标度以后的数 四舍五入到最后的那个标度)
         *
         *setScale(int newScale, RoundingMode roundingMode):返回一个 BigDecimal,其标度<扩展的精确度>为(newScale);
         *newScale:要返回的 BigDecimal值的标度;roundingMode:要应用的 舍入对象<模型>。
         *标度是以 小数点 作为参照物的！！！
         *
         * .doubleValue()  将此 BigDecimal 转换为 double。
         * */


    }

    private void putong() {    //能写成方法的地方 尽量写成方法,这样非常便利 调用,很方便!!!
        System.out.println("总金额是:" + NeedMoney() + "元");

        System.out.println("输入客户给付金额");
        if (input.hasNextDouble()) {
            double payMoney = input.nextDouble();
            // 将所输入的付款格式化，保留两位小数到分。
            BigDecimal bg1 = new BigDecimal(payMoney);
            payMoney = bg1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            if (payMoney >= NeedMoney()) {
                System.out.println("购买成功！");
                System.out.println("收您" + payMoney + "元，" + "找零" + (payMoney - NeedMoney()) + "元");

//打印结算小票：
                System.out.println("\t\t\t\t\t\t铁蛋超市");
                System.out.println("请输入收银员号：");
                int i = input.nextInt();
                System.out.println("请输入小票号：");
                int j = input.nextInt();
                System.out.println("收银员号：" + i + "\t\t" + "小票号：" + j);


                System.out.println("序\t商品编号\t商品名称\t\t商品数量\t商品价格\t合计金额");
                System.out.println("============================================================");

                int k = 1;
                for (CartGoods temp : CartGoodsDao.dingdan) {

                    System.out.println(k + "\t" +
                            temp.getCartId() + "\t" +

                            temp.getQuality() + "\t"

                    );
                    k++;
                }
                System.out.println("============================================================");


                System.out.println("总数量：" + allCount() + " " + "\t\t" + "应收：" + NeedMoney() + "元");
                System.out.println("实收：" + payMoney + "元" + "\t\t" + "找零：" + (payMoney - NeedMoney()) + "元");

                //获取当前时间：
                // 设置日期格式
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date d = new Date();
                sdf.format(d);
                System.out.println(sdf.format(d));
                //也可以简写成System.out.println(sdf.format(new Date()));

                System.out.println("此小票是您退换货及核对积分的凭证，请妥善保管！");
                System.out.println("===================================");

            } else {
                System.out.println("您所付的金额不足,请修改金额！");
            }

        }

    }


    private int allCount() {
        int i = 0;
        for (CartGoods temp : CartGoodsDao.dingdan) {
            i += temp.getQuality();
        }

        return i;
    }

    private void huiyuan() {
        boolean r = true;
        do {
            System.out.println("请您输入会员卡号：");
            if (input.hasNextInt()) {
                String str = input.next();
                if (str.equals(VipNum)) {
                    System.out.println("会员卡号正确，请输入您所要支付的金额：");
                    r = false;
                } else {
                    System.out.println("会员卡号错误");
                }
            }
        } while (r);


        if (input.hasNextDouble()) {
            double payMoney = input.nextDouble();
			/*// 将所输入的付款格式化，保留两位小数到分。
			BigDecimal bg1 = new BigDecimal(payMoney);
			payMoney = bg1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();*/
            if (payMoney >= NeedMoney()) {
                System.out.println("购买成功！");
                System.out.println("收您" + payMoney + "元，" + "找零" + (payMoney - NeedMoney()) + "元");

//打印结算小票：
                System.out.println("\t\t\t\t\t\t铁蛋超市");
                System.out.println("请输入收银员号：");
                int i = input.nextInt();
                System.out.println("请输入小票号：");
                int j = input.nextInt();
                System.out.println("收银员号：" + i + "\t\t" + "小票号：" + j);


                System.out.println("序\t商品编号\t商品名称\t\t商品数量\t商品价格\t合计金额");
                System.out.println("============================================================");

                int k = 1;
                for (CartGoods temp : CartGoodsDao.dingdan) {

                    System.out.println(k + "\t" +
                            temp.getCartId() + "\t" +

                            temp.getQuality() + "\t"
                    );
                    k++;
                }
                System.out.println("============================================================");


                System.out.println("总数量：" + allCount() + " " + "\t\t" + "应收：" + NeedMoney() + "元");
                System.out.println("实收：" + payMoney + "元" + "\t\t" + "找零：" + (payMoney - NeedMoney()) + "元");

                System.out.println("本次累计积分成功\t卡号：2011");
                System.out.println("输入本次积分所获得的积分：");
                int jifen2 = input.nextInt();
                System.out.println("最终积分=" + jifen + jifen2);

                //获取当前时间：
                // 设置日期格式
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date d = new Date();
                sdf.format(d);
                System.out.println(sdf.format(d));
                //也可以简写成System.out.println(sdf.format(new Date()));

                System.out.println("此小票是您退换货及核对积分的凭证，请妥善保管！");
                System.out.println("===================================");

            } else {
                System.out.println("您所付的金额不足,请修改金额！");
            }

        }

        //store<仓库>----->kucun<库存>------------>Goods<仓库商品>(id,name,count,price)
        //cart<购物车>---->carts<购物车小仓库>---->order<购物车商品>(id,count,<subbotal>)




	/*	老师做超市用到的方法回顾（此程序中不能用！！！）
		//购买数量的判断方法：    g是你 扫描的要购买的 商品，它的类型属于Goods(库存商品类)
		private boolean checkCount(int p_GoodsCount,Goods p_g){
			//						| 库存数量        |购买数量 |
			boolean r=flase;
			//购买数量大于库存，不允许
			while(r=true){
			if(p_GoodsCount<=p_g.getCount()){	//★先用if()在括号里写入对比对象
				r=true;							//★然后再用r判断if后面的括号中的逻辑真假
				break;
			}else{
			r=false;????System.out.println("错误..购买数量不能大于库存数，请重新输入");
			}
			
			
		}
		return r;
		*/


    }
}